package com.xlh.service.courseTest;

import com.xlh.dto.PageDTO;
import com.xlh.dto.courseTest.*;
import com.xlh.dto.courseTest.paper.PaperDTO;
import com.xlh.dto.courseTest.paper.PaperDetailDTO;
import com.xlh.dto.courseTest.paper.TeacherPaperDTO;
import com.xlh.param.courseTest.PaperParam;
import com.xlh.param.courseTest.PreviewPaperParam;
import com.xlh.param.courseTest.TestStartParam;
import com.xlh.pojo.courseTest.CourseTestPaper;
import com.xlh.pojo.user.Class;

import java.util.List;

/**
 * @author zhr 2019/2/20
 */
public interface PaperService {
    /**
     * @return 查询学生教师试卷列表
     */
    PageDTO<PaperListDataDTO> listPaper(Integer pageNum, Integer pageSize, Long courseId);

    /**
     * 删除试卷
     */
    void deletePaper(Long paperId, Long courseId);

    /**
     * 开始考试
     *
     * @param userId   用户id
     * @param courseId 课程id
     * @param paperId  试卷id
     * @param param    开始考试时设置的参数
     */
    void startTest(Long courseId, Long paperId, TestStartParam param);

    /**
     * @param isTeacher  是否教师用户
     * @param userId     用户id
     * @param paperId    试卷id
     * @param questionId 题目id（学生获取试题需要）
     * @param courseId   课程id
     * @return 根据用户身份获取对应的题目信息
     */
    PaperDTO paperDetails(Boolean isTeacher, Long userId, Long paperId, Long questionId, Long courseId);



    void  download(Long paperId, String className, String paperName);

    /**
     * 批阅学生列表
     *
     * @param userInfo 查询关键字：学生学号或姓名
     * @param paperId  试卷id
     */
    PageDTO<AnswerSheetListDTO> studentList(Integer pageNum, Integer pageSize, String userInfo, Long paperId);

    /**
     * @param answerSheetId 答题卡id
     * @return 批阅详情页面数据
     */
    PaperReadingDTO studentDetails(Long answerSheetId);

    /**
     * @param courseId 课程id
     * @param param    考试信息，选定题目等参数
     * @param userId   登陆用户id
     * @return 教师预览试卷页面数据
     */
    TeacherPaperDTO previewPaper(Long courseId, PreviewPaperParam param);

    /**
     * 保存试卷
     *
     * @param courseId 课程id
     * @param param    试卷参数
     * @param userId   用户id
     */
    void savePaper(Long courseId, PaperParam param);

    CourseTestPaper selectPaperById(Long id);

    /**
     * @param courseId 课程id
     * @return 课程下的默认班级
     */
    Class getDefaultClass(Long courseId);

    /**
     * @param userId   用户id
     * @param courseId 课程id
     * @return 试卷列表（无分页），用于学生端
     */
    List<PaperListDataDTO> listPaper(Long userId, Long courseId);

    void put(CourseTestPaper paper);

    CourseTestPaper get(Long id);

    void remove(Long id);

    Long getTimeLeft(Long paperId);

    void updatePaper(CourseTestPaper paper);

    /**
     * 批阅试卷
     *
     * @param typeReadingList 批阅列表
     */
    void readPaper(Long answerSheetId, List<TypeReadingDTO> typeReadingList);

    /**
     * @return 正在考试课程id的结合
     */
    List<Long> queryTestingCourseIds(List<Long> courseIds);

    /**
     * 按照课程删除试卷
     */
    void deletePaper(List<Long> courseIds);

    /**
     * 按照给定的课程班级删除试卷
     */
    void deletePaper(Long courseId, List<Long> classIds);

    /**
     * 查询正在进行的所有考试
     */
    List<CourseTestPaper> getTestingPaper();

    List<CourseTestPaper> selectByCourseIds(List<Long> courseIds);

    /**
     * 结束考试
     */
    void endPaper(Long id);

    /**
     * 获取正在考试的课程-班级映射
     */
    List<CourseClassDTO> getCourseClassPaper(List<CourseClassDTO> list);

    /**
     * 下载学生考试成绩Excel
     */
	String download(String userInfo, Long paperId);

    /**
     * 下载学生考试成绩PdfZip
     * @param userInfo
     * @param paperId
     * @return
     */
    String downloadPdfZip(String userInfo, Long paperId);

    /**
     * 试卷详情页面
     * @param paperId
     * @return
     */
    PaperDetailDTO paperDetail(Long paperId);


}
